
/** 读取文件内容
 * @param filePath 文件路径
 * */
export function readFileContent(filePath: string): string {
  try {
    // 动态检测文件编码
    const detectedEncoding = detectFileEncoding(filePath);

    // 正确实例化对象
    const fis = plus.android.newObject('java.io.FileInputStream', filePath);
    const isr = plus.android.newObject('java.io.InputStreamReader', fis, detectedEncoding);
    const br = plus.android.newObject('java.io.BufferedReader', isr);

    let fileText = "";
    let line: string;
    while ((line = plus.android.invoke(br, 'readLine')) !== null) {
      fileText += line + '\n';
    }

    // 关闭资源
    plus.android.invoke(br, 'close');
    plus.android.invoke(isr, 'close');
    plus.android.invoke(fis, 'close');

    return fileText;

  } catch (e) {
    console.error("歌词读取失败:", e);
    uni.showToast({ title: '歌词加载失败', icon: 'none' });
    return '';
  }
}


/** 检测文件编码 */
export function detectFileEncoding(filePath: string): string {
  try {

    const fis = plus.android.newObject('java.io.FileInputStream', filePath);
    // 修正：添加编码声明提升检测准确性
    const detector = plus.android.newObject('com.ibm.icu.text.CharsetDetector');
    plus.android.invoke(detector, 'setDeclaredEncoding', '');
    
    // 修正：使用 newObject 替代不存在的 newArray 方法
    const buffer = plus.android.newObject('byte[]', 4096);  // 修改点
    let bytesRead: number;

    // 修正：添加数据预处理循环
    while ((bytesRead = plus.android.invoke(fis, 'read', buffer)) > 0) {
      // 修正：正确传递读取字节数参数
      plus.android.invoke(detector, 'handleData', buffer, 0, bytesRead);
      if (plus.android.invoke(detector, 'isDone')) break;
    }

    plus.android.invoke(detector, 'dataEnd');
    const match = plus.android.invoke(detector, 'getDetectedCharset');
    plus.android.invoke(fis, 'close');

    // 修正：添加常见中文编码兜底逻辑
    return match || (containsChineseCharacters(buffer) ? 'GBK' : 'UTF-8');
    
  } catch (e) {
    console.error('编码检测失败:', e);
    return 'GBK';
  }
}

// 新增：中文特征字符检测方法
function containsChineseCharacters(buffer: any): boolean {
  try {
    const ByteClass = plus.android.importClass('java.lang.Byte');
    for (let i = 0; i < 4096; i++) {
      const b = plus.android.invoke(buffer, 'get', i);
      if (b === null || ByteClass.valueOf(b) > 0x7F) {
        return true; // 存在非ASCII字符时优先使用GBK
      }
    }
  } catch (e) {
    console.warn('中文检测异常:', e);
  }
  return false;
}

/** 检查文件管理权限 */
function checkStoragePermission() {
  try {
    const Environment = plus.android.importClass('android.os.Environment');
    // @ts-ignore
    return Environment.isExternalStorageManager();
  }catch (e) {
    console.error('权限检查失败:', e);
    return false;
  }

}

export function getPermission() {
  const Build = plus.android.importClass('android.os.Build');
  const mainActivity = plus.android.runtimeMainActivity();
  const Intent = plus.android.importClass('android.content.Intent');
  const Settings = plus.android.importClass('android.provider.Settings');
  const Uri = plus.android.importClass('android.net.Uri');

  return new Promise((resolve, reject) => {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
      if(checkStoragePermission()){
        return resolve(true);
      }

      const intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
      intent.setData(Uri.parse("package:" + mainActivity.getPackageName()));
      
      // 修改：添加try-catch处理异常
      try {
        mainActivity.startActivityForResult(intent, 100);
        // @ts-ignore
        mainActivity.onActivityResult = (requestCode: number, resultCode: number) => {
          if (requestCode === 100) {
            resolve(checkStoragePermission());
          }
        };
      } catch (e) {
        console.error('启动权限页面失败:', e);
        reject(false);
      }
      
    } else {
      // 修改：优化旧版本权限请求逻辑
      plus.android.requestPermissions(
        ['android.permission.READ_EXTERNAL_STORAGE', 'android.permission.WRITE_EXTERNAL_STORAGE'],
        async (result) => {  // 添加async处理异步
          if (!result.granted) {
            // 新增：权限拒绝时的提示
            uni.showModal({
              title: '权限提示',
              content: '需要存储权限才能读取本地音乐',
              success: (res) => {
                if (res.confirm) {
                  const intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                  intent.setData(Uri.parse("package:" + mainActivity.getPackageName()));
                  mainActivity.startActivity(intent);
                }
              }
            });
            reject(false);
          } else {
            resolve(true);
          }
        },
        (error) => {
          console.error('权限请求出错', error);
          reject(false);
        }
      );
    }
  });
}

// 新增：补充类型声明
declare interface AudiopalyRecord {
  id: number;
  name: string;
  artist: string;
  album: string;
  duration: number;
  path: string;
  cover?: string;
  lyric?: string;
}
